SPORE.$Import('core.fx.base');

/*
---

name: Fx.Transitions

description: Contains a set of advanced transitions to be used with any of the Fx Classes.

license: MIT-style license.

credits:
  - Easing Equations by Robert Penner, <http://www.robertpenner.com/easing/>, modified and optimized to be used with MooTools.

requires: Fx

provides: Fx.Transitions

...
*/

SPORE.register('core.fx.transitions',function($ns){

	Fx.implement({
	
		getTransition: function(){
			var trans = this.options.transition || Fx.Transitions.Sine.easeInOut;
			if (typeof trans == 'string'){
				var data = trans.split(':');
				trans = Fx.Transitions;
				trans = trans[data[0]] || trans[data[0].capitalize()];
				if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')];
			}
			return trans;
		}
	
	});
	
	Fx.Transition = function(transition, params){
		params = Array.from(params);
		var easeIn = function(pos){
			return transition(pos, params);
		};
		return Object.append(easeIn, {
			easeIn: easeIn,
			easeOut: function(pos){
				return 1 - transition(1 - pos, params);
			},
			easeInOut: function(pos){
				return (pos <= 0.5 ? transition(2 * pos, params) : (2 - transition(2 * (1 - pos), params))) / 2;
			}
		});
	};
	
	Fx.Transitions = {
	
		linear: function(zero){
			return zero;
		}
	
	};
	
	
	
	Fx.Transitions.extend = function(transitions){
		for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]);
	};
	
	Fx.Transitions.extend({
	
		Pow: function(p, x){
			return Math.pow(p, x && x[0] || 6);
		},
	
		Expo: function(p){
			return Math.pow(2, 8 * (p - 1));
		},
	
		Circ: function(p){
			return 1 - Math.sin(Math.acos(p));
		},
	
		Sine: function(p){
			return 1 - Math.cos(p * Math.PI / 2);
		},
	
		Back: function(p, x){
			x = x && x[0] || 1.618;
			return Math.pow(p, 2) * ((x + 1) * p - x);
		},
	
		Bounce: function(p){
			var value;
			for (var a = 0, b = 1; 1; a += b, b /= 2){
				if (p >= (7 - 4 * a) / 11){
					value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2);
					break;
				}
			}
			return value;
		},
	
		Elastic: function(p, x){
			return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x && x[0] || 1) / 3);
		}
	
	});
	
	['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){
		Fx.Transitions[transition] = new Fx.Transition(function(p){
			return Math.pow(p, i + 2);
		});
	});

});